// es6相关

/**
 * var let const
 */

// 声明提升 先上车=>后买买票
//! console.log(a);

var a = 1;
var a = 2;

/*  
    变量覆盖  
    var的声明是 先var a  
    后续才进行赋值  所以执行顺序是 
    var a
    a = 1
    a = 2
**/
//! console.log(a);

// var 无块级作用域
function fn1() {
  for (let i = 0; i < 3; i++) {
    console.log(i); // 0 1 2
  }
  console.log(i); // 3
}

// const 定义后必须赋值
// const 定义后不允许修改
// const 定义的是常量 建议大写
const b = 123;

// 解构赋值
let c1 = 1;
let c2 = 2;
[c1, c2] = [c2, c1]; // 此时 c1 c2 的值互换了

// 快速去重
const arr = [1, 2, 3, 1, 2, 4];
const arr1 = [...new Set(arr)]; //[1,2,3,4]

// 数组扁平化
const arr3 = [1, [1, 2], [2, 3]];
const arr4 = JSON.parse(
  "[" + JSON.stringify(arr3).replace(/\[/g, "").replace(/\]/g, "") + "]"
);
const arr5 = arr3.flat(Infinity);

function flatten(arr) {
  return !Array.isArray(arr) ? arr : [].concat.apply([], arr.map(flatten));
}

const arr6 = flatten(arr3);

//!console.log(arr4);

// promise 标准性质问题
/**
 * 这是一个构造函数 是同步执行的 在new promise 的一瞬间 1 和 2 就被打印了
 */
const promise = new Promise((resolve, reject) => {
  console.log(1);
  resolve();
  reject();
  console.log(2);
});

// 异步执行的 => 最后执行 等待 4打印后再打印3
promise.then(() => {
  console.log(3);
});

// 宏任务
console.log(4);
